<?php
/**
 * 数据库模型基类
 *
 * @author steven.liao 2009.06
 * @author seraph.liujb 2009.07.24
 */

class BaseModel
{
	/**
	 * 数据库表名
	 * @var string _table
	 */
	protected $_table = '';

	/**
	 * 主键字段名
	 * @var string _primary
	 */
	protected $_primary = '';

	/**
	 * 查询字段列表
	 * @var string _field
	 */
	protected $_field = array('*');

	/**
	 * 排序字段列表
	 * @var string _order
	 */
	protected $_order = '';

	/**
	 * 构造
	 * @return void
	 */
	public function __construct()
	{
		//校验数据模型基本设置有效性
		$this->_validate();
		//调用初始化接口
		$this->init();
	}

	/**
	 * 检验_table，_primary的值是否有效
	 * @return boolean
	 */
	private function _validate()
	{
		if('' == $this->_table){
			throw new Common_Exception('没有指定表名！');
		}
		if('' == $this->_primary){
			throw new Common_Exception('没有指定主键！');
		}
		return true;
	}

	/**
	 * 初始操作，为后继扩展类预留接口
	 * @return void
	 */
	public function init()
	{
	}

	/**
	 * 获取数据库的读连接
	 * @return Zend_Db_Adapter_Abstract
	 */
	protected function getRDB()
	{
		return Common_DB::getRDB();
	}

	/**
	 * 获取数据库的写连接
	 * @return Zend_Db_Adapter_Abstract
	 */
	protected function getWDB()
	{
		return Common_DB::getWDB();
	}

	/**
	 * 设定 数据返回字段表
	 * @param array or string $field
	 * @return BaseModel
	 */
	public function setField($field = '*')
	{
		$this->_field = $field;
		return $this;
	}

	/**
	 * 获取 数据返回字段表
	 * @return array or string
	 */
	public function getField()
	{
		return $this->_field;
	}

	/**
	 * 设定 查询排序字段表
	 * @param string $order
	 * @return BaseModel
	 */
	public function setOrder($order)
	{
		$this->_order = $order;
		return $this;
	}

	/**
	 * 获取查询排序字段表
	 * @return string
	 */
	public function getOrder()
	{
		return $this->_order;
	}

	/**
	 * 获取select对象，为生成sql查询语句准备
	 * @return Zend_Db_Select
	 */
	protected function select()
	{
		return Common_DB::getRDB()->select();
	}

	/**
	 * 新增
	 * @param array $data
	 * @return int
	 */
	public function insert($data)
	{
		if (!is_array($data)) {
			throw new Common_Exception('更新的数据类型必须是数组！');
		}
		$wdb = $this->getWDB();
		return $wdb->insert($this->_table,$data);
	}

	/**
	 * 更新
	 * @param int $id
	 * @param array $data
	 * @return int
	 */
	public function update($id,$data)
	{
		if (!Zend_Validate::is($id,'digits')) {
			throw new Common_Exception('主键id必须是数字类型！' . $this->_table . ' ' . $this->_primary);
		}
		if (!is_array($data)) {
			throw new Common_Exception('更新的数据类型必须是数组！');
		}
		$wdb = $this->getWDB();
		return $wdb->update($this->_table,$data,$wdb->quoteInto($this->_primary.' = ?',$id));
	}

	/**
	 * 删除
	 * @param int $id;
	 * @return int
	 */
	public function delete($id)
	{
		if (!Zend_Validate::is($id,'digits')) {
			throw new Common_Exception('主键id必须是数字类型！' . $this->_table . ' ' . $this->_primary);
		}
		$wdb = $this->getWDB();
		return $wdb->delete($this->_table,$wdb->quoteInto($this->_primary.' = ?',$id));
	}

	/**
	 * 按指定主键id取出信息
	 * @param int $id
	 * @return array
	 */
	public function find($id)
	{
		if (!Zend_Validate::is($id,'digits')) {
			throw new Common_Exception('主键id必须是数字类型！' . $this->_table . ' ' . $this->_primary);
		}
		$sql = $this->select();
		$sql->from($this->_table,$this->_field)
		->where($this->_primary.' = ?',$id);
		return $this->fetchRow($sql);
	}

	/**
	 * Zend_Db fetchALl
	 * @var string $sql
	 * @return array
	 */
	public function fetchAll($sql)
	{
		return $this->getRDB()->fetchAll($sql);
	}

	/**
	 * Zend_Db fetchRwo
	 * @var string $sql
	 * @return array
	 */
	public function fetchRow($sql)
	{
		return $this->getRDB()->fetchRow($sql);
	}

	/**
	 * Zend_Db fetchCol
	 * @var string $sql
	 * @return array
	 */
	public function fetchCol($sql)
	{
		return $this->getRDB()->fetchCol($sql);
	}

	/**
	 * Zend_Db fetchPairs
	 * @var string $sql
	 * @return array
	 */
	public function fetchPairs($sql)
	{
		return $this->getRDB()->fetchPairs($sql);
	}

	/**
	 * Zend_Db fetchOne
	 * @var string $sql
	 * @return array
	 */
	public function fetchOne($sql)
	{
		return $this->getRDB()->fetchOne($sql);
	}

	/**
	 * Zend_Db fetchAssoc
	 * @var string $sql
	 * @return array
	 */
	public function fetchAssoc($sql)
	{
		return $this->getRDB()->fetchAssoc($sql);
	}

	/**
	 * 获取指定字段的最大值,如果未设置字段，则返回主键字段的最大值
	 * @param string $field
	 * @return int | string
	 */
	public function getFieldMaxValue($field = null)
	{
		if (is_null($field)){
			$field = $this->_primary;
		}
		$sql = "SELECT MAX({$field}) AS max FROM {$this -> _table}";
		if (($max_value=$this->fetchOne($sql))>=0) {
			return $max_value;
		}
		else {
			throw new Common_Exception('指定字段不存在！');
		}
	}

	/**
	 * 根据指定的条件来查询某一条记录,find()无法完成的情况下使用
	 * @param  array $condition
	 * @return array
	 * @author Will.Xu
	 */
	public function findRow($condition)
	{
		$db = Common_DB::getRDB();
		# 获取Zend_Db_Select对象
		$select = $db->select();
		$select->from($this->_table,'*');
		# 遍历条件
		foreach ($condition as $k => $v) {
			$select->where("{$k} = ?",$v);
		}
		return $db->fetchRow($select);
	}

	/**
	 * 获取所有符合条件的记录，如果$condition是空的话，则返回所有的记录
	 * @param  Array $condition
	 * @param  String|Array $order
	 * @return Array
	 * @author Will.Xu
	 */
	public function findMany($condition = null,$order=null)
	{
		$db = Common_DB::getRDB();
		$select = $db -> select();
		$select->from($this->_table,'*');
		# 如果设置了查询条件，刚按查询条件来查询
		if (!empty($condition) && is_array($condition)) {
			foreach ($condition as $k => $v) {
				$select->where("{$k} = ?",$v);
			}
		}
		if (is_null($order)) {
			$order = $this->_primary;
		}
		$select->order($order);
		return $db->fetchAll($select);
	}
}